package test;

public class 回文字符串 {
    public static void main(String[] args) {
        String s1 = "racecar"; // 测试用例1
        String s2 = "Hello World"; // 测试用例2
        String s3 = "A man, a plan, a canal, Panama!"; // 测试用例3

        System.out.println(isPalindrome(s1)); // 输出是否为回文字符串
        System.out.println(isPalindrome(s2)); // 输出是否为回文字符串
        System.out.println(isPalindrome(s3)); // 输出是否为回文字符串
    }

    public static boolean isPalindrome(String s) {
        if (s == null || s.length() == 0) { // 判断字符串是否为空或长度为0
            return false;
        }

        s = s.toLowerCase(); // 将字符串转换为小写字母
        int i = 0, j = s.length() - 1; // 定义左右指针i和j

        while (i < j) { // 循环判断左右指针是否相等
            while (i < j && !isAlphanumeric(s.charAt(i))) { // 跳过非字母数字字符
                i++;
            }
            while (i < j && !isAlphanumeric(s.charAt(j))) { // 跳过非字母数字字符
                j--;
            }
            if (s.charAt(i) != s.charAt(j)) { // 如果左右指针指向的字符不相等，说明不是回文字符串
                return false;
            }
            i++; // 移动左指针
            j--; // 移动右指针
        }

        return true; // 如果循环结束，说明是回文字符串
    }

    public static boolean isAlphanumeric(char c) {
        return Character.isLetter(c) || Character.isDigit(c); // 判断是否为字母数字字符
    }
}
